-
Notifications
You must be signed in to change notification settings - Fork 40
850 #1100
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: principal
Are you sure you want to change the base?
850 #1100
Conversation
…imitivas de Vetor, aumentando a cobertura desses para 100%
…o, números pequenos e grandes, além de configurações de casas decimais
…s de Texto, incluindo formatação, aparar, partição, divisão e manipulação de texto.
…incluindo aleatorio_entre, aleatorio, algum, arredondar, encontrar, filtrar_por, e outros, aumentando a cobertura de testes.
…alores, remoção e verificação de existência, além de testes para formatação de números com diferentes casos. Atualiza documentação da primitivas de dicionário
…s lógicas, atribuições por índice, acesso a propriedades, e manipulação de variáveis, melhorando a cobertura de testes.
…t.ts, analisador-semantico.test.ts e formatador-delegua
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Este PR (“850”) foca em aumentar a cobertura de testes do dialeto Pituguês e de primitivas/formatadores, além de ajustar a documentação/assinatura da primitiva de dicionário relacionada a conter chave.
Changes:
- Adiciona uma grande quantidade de testes para primitivas (texto/número/vetor/tupla) e biblioteca global do Pituguês.
- Expande testes do interpretador Pituguês (com e sem depuração), formatadores e analisador semântico.
- Ajusta assinatura/documentação de
contem/contémem primitivas de dicionário para o formato “infix”.
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| testes/primitivas/primitivas-texto.test.ts | Novos testes de primitivas de texto (inclui casos adicionais e testes com optional chaining). |
| testes/primitivas/primitivas-numero.test.ts | Casos adicionais para formatar(). |
| testes/interpretador/dialetos/pitugues/interpretador-pitugues.test.ts | Testes adicionais para primitivas de dicionário e formatar() em números. |
| testes/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.test.ts | Novos testes focados em depuração e acesso/atribuição por índice. |
| testes/formatadores/formatador-pitugues.test.ts | Amplia cobertura do formatador Pituguês com diversos cenários. |
| testes/formatadores/formatador-delegua.test.ts | Ajustes de formatação + grande bloco de cobertura adicional. |
| testes/bibliotecas/dialetos/pitugues/primitivas-vetor.test.ts | Expande testes de primitivas de vetor (muitos métodos). |
| testes/bibliotecas/dialetos/pitugues/primitivas-tupla.test.ts | Adiciona teste de erro para paraVetor. |
| testes/bibliotecas/dialetos/pitugues/primitivas-texto.test.ts | Expande amplamente testes de primitivas de texto no Pituguês (inclui formatar). |
| testes/bibliotecas/dialetos/pitugues/biblioteca-global.test.ts | Adiciona muitos testes para funções globais (aleatório/algum/filtrar etc.). |
| testes/analisador-semantico/dialetos/pitugues/analisador-semantico.test.ts | Expande cenários do analisador semântico e adiciona testes de avaliação constante. |
| fontes/bibliotecas/dialetos/pitugues/primitivas-dicionario.ts | Ajusta assinatura/documentação de contem/contém para forma “infix”. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| it('Com casas decimais igual a zero', async () => { | ||
| const resultado = await primitivasNumero.formatar.implementacao(interpretador, 1234.56, 0); | ||
| expect(resultado).toStrictEqual('1.234,56'); | ||
| }); | ||
|
|
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Este teste chama primitivasNumero.formatar(..., 0) passando um número onde a API espera um dicionário de opções. Como 0 é falsy, o teste acaba exercitando o comportamento padrão (2 casas) e não valida “casas decimais = 0”. Troque para um cenário válido (ex.: { casasDecimais: 0 }) ou remova o teste se a API não aceitar número como terceiro parâmetro.
| it('Com casas decimais igual a zero', async () => { | |
| const resultado = await primitivasNumero.formatar.implementacao(interpretador, 1234.56, 0); | |
| expect(resultado).toStrictEqual('1.234,56'); | |
| }); | |
| describe('encontrar_ultimo', () => { | ||
| it('deve retornar o índice da última ocorrência', async () => { | ||
| const texto = "Mi casa, su casa."; | ||
| const subtexto = "casa"; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(12); | ||
| } | ||
| }); | ||
|
|
||
| it('deve retornar -1 quando o subtexto não é encontrado', async () => { | ||
| const texto = "Mi casa, su casa."; | ||
| const subtexto = "nada"; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(-1); | ||
| } | ||
| }); | ||
|
|
||
| it('deve retornar o índice da primeira ocorrência quando há apenas uma', async () => { | ||
| const texto = "Olá mundo"; | ||
| const subtexto = "Olá"; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(0); | ||
| } | ||
| }); | ||
| it('deve retornar o índice correto passando o índice inicial', async () => { | ||
| const texto = "abc def abc ghi abc"; | ||
| const subtexto = "abc"; | ||
| const indiceInicial = 10; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto, | ||
| indiceInicial | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(16); | ||
| } | ||
| }) | ||
| it('deve retornar o índice correto quando o índice inicial é negativo', async () => { | ||
| const texto = "abc def abc ghi abc"; | ||
| const subtexto = "abc"; | ||
| const indiceInicial = -5; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto, | ||
| indiceInicial | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(16); | ||
| } | ||
| }); | ||
| it('deve retornar -1 quando o índice inicial é maior que o tamanho do texto', async () => { | ||
| const texto = "abc def abc ghi abc"; | ||
| const subtexto = "abc"; | ||
| const indiceInicial = 100; | ||
| const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.( | ||
| interpretador, | ||
| texto, | ||
| subtexto, | ||
| indiceInicial | ||
| ); | ||
| if (resultado !== undefined) { | ||
| expect(resultado).toBe(-1); | ||
| } | ||
| }) |
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Os novos testes de encontrar_ultimo/inverter usam optional chaining (?.) + if (resultado !== undefined); isso faz o teste passar mesmo se a primitiva não existir/for undefined, reduzindo a utilidade da suíte. Como inverter existe neste dialeto e encontrar_ultimo aparentemente não (no módulo de primitivas de texto), o ideal é: (1) remover o ?. e falhar se a primitiva deveria existir; ou (2) trocar para it.skip/condicional explícita que valide a existência antes de testar, deixando claro o contrato.
| it('visitarExpressaoAcessoIndiceVariavel com TuplaN válida', async () => { | ||
|
|
||
| const lit1 = new Literal(1, 1, 'valor1', 'texto'); | ||
| const lit2 = new Literal(1, 2, 'valor2', 'texto'); | ||
| const tupla = new TuplaN(1, 6); | ||
|
|
||
| jest.spyOn(interpretador, 'avaliar') | ||
| .mockResolvedValueOnce(tupla) | ||
| .mockResolvedValueOnce(0); | ||
|
|
||
| jest.spyOn(interpretador, 'resolverValor') | ||
| .mockReturnValueOnce(tupla) | ||
| .mockReturnValueOnce(0); | ||
|
|
||
|
|
||
| const expressao = { | ||
| linha: 1, | ||
| paraTexto: () => '<expressao>', | ||
| entidade: tupla, | ||
| indice: 0 | ||
| } as any as AcessoIndiceVariavel; | ||
| const resultado = await interpretador.visitarExpressaoAcessoIndiceVariavel(expressao); | ||
| expect(resultado).toBe('valor1'); | ||
| }); | ||
|
|
||
| it('visitarExpressaoAcessoIndiceVariavel com índice inválido (não inteiro)', async () => { | ||
|
|
||
|
|
||
| const tupla = new TuplaN(1, [new Literal(1, 1, 'x', 'texto')]); | ||
|
|
||
| jest.spyOn(interpretador, 'avaliar') | ||
| .mockResolvedValueOnce(tupla) | ||
| .mockResolvedValueOnce(1.5); | ||
|
|
||
| jest.spyOn(interpretador, 'resolverValor') | ||
| .mockReturnValueOnce(tupla) | ||
| .mockReturnValueOnce(1.5); | ||
|
|
||
| const entidade = { linha: 1, paraTexto: () => '<e>' } as any; | ||
| const indice = { linha: 1, paraTexto: () => '<i>' } as any; | ||
| const simbolo = { lexema: ']', linha: 1 } as any; | ||
| const expressao = new AcessoIndiceVariavel(1, entidade, indice, simbolo); | ||
|
|
||
| await expect(interpretador.visitarExpressaoAcessoIndiceVariavel(expressao)).rejects.toThrow('Índice deve ser inteiro.'); | ||
| }); | ||
|
|
||
| it('visitarExpressaoAcessoIndiceVariavel com índice fora do intervalo', async () => { | ||
|
|
||
| const tupla = new TuplaN(1, [new Literal(1, 1, 'x', 'texto')]); | ||
|
|
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Os testes adicionados para visitarExpressaoAcessoIndiceVariavel constroem TuplaN com assinatura incorreta (new TuplaN(1, 6) / new TuplaN(1, [ ... ])), deixando elementos como undefined. O método em produção acessa objetoResolvido.elementos.length e vai falhar em runtime. Crie a tupla com (hashArquivo, linha, elementos) e use os Literal criados no array de elementos para validar o retorno.
| const simbolo = { lexema: ']', linha: 1 } as any; | ||
| const expressao = new AtribuicaoPorIndice(1, objeto, indice, valor, simbolo); |
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
O teste de visitarExpressaoAtribuicaoPorIndice instancia AtribuicaoPorIndice com argumentos fora da ordem esperada (o construto recebe (hashArquivo, linha, objeto, indice, valor), mas o teste passa (hashArquivo, objeto, indice, valor, simbolo)). Isso pode mascarar bugs porque expressao.objeto/indice/valor ficam inconsistentes. Ajuste a chamada para a assinatura correta e remova o argumento simbolo (não faz parte do construto).
| const simbolo = { lexema: ']', linha: 1 } as any; | |
| const expressao = new AtribuicaoPorIndice(1, objeto, indice, valor, simbolo); | |
| const expressao = new AtribuicaoPorIndice(1, 1, objeto, indice, valor); |
| }); | ||
|
|
||
| describe('aleatorio', () => { | ||
| it('retorna número entre 0 e 1', async () => { | ||
| const interpretador = criarInterpretadorMock(); | ||
| const resultado = await aleatorio(interpretador as any); | ||
| expect(typeof resultado).toBe('number'); | ||
| expect(resultado).toBeGreaterThanOrEqual(0); | ||
| expect(resultado).toBeLessThanOrEqual(1); | ||
| }); | ||
| }); |
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A partir do fechamento do describe('biblioteca-global (pituguês)'), vários novos describe(...) foram adicionados fora do bloco principal (o que inclusive aparece pela indentação). Isso não quebra a execução, mas torna a organização do arquivo confusa e pode causar futuros problemas se alguém adicionar hooks (beforeEach/afterEach) no describe principal esperando cobrir todos os testes. Mova esses novos blocos para dentro do describe('biblioteca-global (pituguês)').
| const contem_comum = (nome: string) => { | ||
| return { | ||
| tipoRetorno: 'lógico', | ||
| argumentos: [ | ||
| new InformacaoElementoSintatico( | ||
| 'chave', | ||
| 'qualquer', | ||
| true, | ||
| [], | ||
| 'O elemento como chave do dicionário.' | ||
| ), | ||
| ], | ||
| implementacao: ( | ||
| interpretador: InterpretadorInterface, | ||
| valor: object, | ||
| chave: any | ||
| ): Promise<boolean> => Promise.resolve(chave in valor), | ||
| assinaturaFormato: `dicionário.${nome}(chave: qualquer)`, | ||
| assinaturaFormato: `dicionário contem(chave: qualquer)`, | ||
| documentacao: | ||
| `# \`dicionário.${nome}(chave)\`\n\n` + | ||
| `# \`dicionário contem(chave)\`\n\n` + | ||
| 'Retorna verdadeiro se o elemento passado como parâmetro existe como chave do dicionário. Devolve falso em caso contrário.\n' + | ||
| '\n\n ## Exemplo de Código\n' + | ||
| '\n\n```pitugues\n' + | ||
| 'var d = {"a": 1, "b": 2, "c": 3}\n' + | ||
| `escreva(d.${nome}("a")) // verdadeiro\n` + | ||
| `escreva(d.${nome}("f")) // falso\n\`\`\`` + | ||
| `escreva(d contem "a") // verdadeiro\n` + | ||
| `escreva(d contem "f") // falso\n\`\`\`` + | ||
| '\n\n## Formas de uso\n', | ||
| exemploCodigo: 'dicionário.contem("minhaChave")', | ||
| exemploCodigo: 'dicionário contem "minhaChave"', | ||
| }; |
Copilot
AI
Feb 9, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A factory contem_comum(nome) still receives nome, but assinaturaFormato, documentacao and exemploCodigo are now hardcoded to contem (sem acento), which makes the contém primitive show the wrong signature/docs and leaves an unused parameter. Use nome to generate the correct spelling (e.g., contem vs contém) and keep the signature/docs aligned with the actual callable form for each primitive.
testes/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.test.ts
Outdated
Show resolved
Hide resolved
testes/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.test.ts
Outdated
Show resolved
Hide resolved
…com-depuracao.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Joaolpridolficarvalho
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correção
Adiciona testes